package Study2;

import java.util.Scanner;

/**
 * 包装类的探究
 */
public class Study27 {
    public static void main4(String[] args) {
        Integer a = 200;
        Integer b = 200;
        System.out.println(a == b); // false
        Integer c = 100;
        Integer d = 100;
        System.out.println(c == d); // true
        /*
             static final int low = -128;
            assert IntegerCache.high >= 127;
           public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];  // 范围在 -128 ~ 127 的时候，每次会在这个下标位置
            找取数字
        return new Integer(i);  // 不在该范围的创建一个新对象
    }
         */

    }




    /*
    装箱/装包 ：简单类型包装为——> 包装类类型 Integer.valueOf(i)
    拆箱/拆包：包装类类型 ——> 简单类型 int i = ii.intValue()
    自动装箱(outboxing) 和自动拆箱(outfounboing)
    可以看到在使用过程中，装箱和拆箱带来不少的代码量
    所以为了减少开发者的负担，Java提供了自动机制
    注意自动装箱和自动拆箱是工作在编译期间的一种机制
     */
    public static void main3(String[] args) {
        Integer I = 10;  // 自动装箱
        Double D = 99.9;
//        Long num2 = 10;   // 自动装箱，类型需要匹配到


        int i = I;
        int i2 = (int)I;//自动拆箱
        float d = D.floatValue();
        System.out.println(i);
        System.out.println(d);


    }



    /*
    包装类的使用 ，装箱(boxing) 和拆箱(unboxing)
     */
    public static void main2(String[] args) {
        int i = 10;
        // 装箱操作，新建一个 Integer 类型对象，将 i 的值放入对象的某个属性中
        Integer ii = Integer.valueOf(i);  // 调用valueOF方法，装箱
        System.out.println(ii);
        // 或者
        Integer ij = new Integer(i);  // 调用构造方法，装箱
        System.out.println(ij);   // 默认是原来的类型的数值

        double d = 100.99;
        Double D = Double.valueOf(d);  // 调用valueOf()方法，装箱
        Double D2 = new Double(d);     // 调用构造方法，装箱
        System.out.println(D);
        System.out.println(D2);  // 默认是原来的类型的数值
        System.out.println("***************************************************");
        // 拆箱操作，将Integer对象中的值取出，放到一个基本类型中 ,拆箱存放的类型方法需要一致,小类型可以转为大类型
        double num = ij.doubleValue();
        System.out.println(num);
        double num2 = ij.intValue();
        System.out.println(num2);
        String str = ij.toString();
        System.out.println(str);
        System.out.println("*********************");
        int num3 = D.intValue();
        System.out.println(num3);
        String str2 = D.toString();
        System.out.println(str2);
//        String str3 = D.intValue();   // 拆箱方法不一致类型的转换，int 无法转为 String 类型



    }


    /**
     * 面试题
     */
    // 去重复
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while(scanner.hasNext()) {  // 无限循环输入OJ
            String str = scanner.nextLine();
            StringBuffer ret = new StringBuffer();  // 创建 new 取字符
            for(int i = 0; i < str.length();i++) {
                char ch = str.charAt(i); // 取出字符串中的每个字符，放入其中
                String tmp = ret.toString();  // 定义一个空的字符串
                if(!tmp.contains(ch+"")) {

                    /*
                    contains 判断字符串是否存在于某个字符串中,不存在拼接上
                    因为是字符串所以，我们这里 ch +""拼接上一个空字符串，变成字符串
                     */
                    ret.append(ch);
                }
            }
            System.out.println(ret);
        }
    }


    public static void main7(String[] args) {
        String foo1 = args[1];
        String foo2 = args[2];  // 注意不是，下标位置，是从 0 开始的
        String foo3 = args[3];

        for(int i = 1; i < args.length; i++) {
            System.out.println(args[i]);
        }
    }

    public static void main6(String[] args) {
        boolean b = true ? false : true == true ? false:true;
        // (true) ? (false) : ( (true == true) ? (false) : (true) )
        System.out.println(b);
        boolean b2 = false ? false :true == true ? false:true;
        // (false) ? (false) : ( ( (true == true) ? (false) : (ture) )
        System.out.println(b2);
    }


    public static boolean isAdmin(String userId) {
        return userId.toLowerCase() == "abmin"; // toLowerCase() 作用是将大写字符转为小写字符，注意源码的阅读
        //   return new String(result, 0, len + resultOffset); 源码上是 创建了一个新的对象，所以比较的是
        // 字符串的 == 比较的是引用的是否是同一个对象
    }
    public static void main5(String[] args) {
        System.out.println(isAdmin("Abmin"));

    }

}
